#include "app_msg.h"

gate_status_t app_msg_json_2_msg(char *json, msg_t *msg)
{
    cJSON *root = cJSON_Parse(json);
    if (root == NULL)
    {
        log_error("json parse error");
        return ERROR;
    }

    cJSON *connTypeItem = cJSON_GetObjectItem(root, "connType");
    cJSON *motorIdItem = cJSON_GetObjectItem(root, "motorId");
    cJSON *actionItem = cJSON_GetObjectItem(root, "action");
    cJSON *motorSpeedItem = cJSON_GetObjectItem(root, "motorSpeed");
    cJSON *statusItem = cJSON_GetObjectItem(root, "status");

    if (connTypeItem == NULL || motorIdItem == NULL || actionItem == NULL)
    {
        log_error("json item error");
        cJSON_Delete(root);
        return ERROR;
    }

    msg->connType = strdup(connTypeItem->valuestring);
    msg->motorId = motorIdItem->valueint;
    msg->action = strdup(actionItem->valuestring);

    if (statusItem != NULL)
    {
        msg->status = strdup(statusItem->valuestring);
    }
    if (motorSpeedItem != NULL)
    {
        msg->motorSpeed = motorSpeedItem->valueint;
    }

    cJSON_Delete(root);
    return OK;
}

gate_status_t app_msg_msg_2_json(msg_t *msg, char *json)
{
    if (msg == NULL || json == NULL)
    {
        log_error("msg or json is null");
        return ERROR;
    }

    cJSON *root = cJSON_CreateObject();

    cJSON_AddStringToObject(root, "action", msg->action);
    cJSON_AddStringToObject(root, "connType", msg->connType);
    cJSON_AddNumberToObject(root, "motorId", msg->motorId);
    cJSON_AddNumberToObject(root, "motorSpeed", msg->motorSpeed);

    if (msg->status != NULL)
    {
        cJSON_AddStringToObject(root, "status", msg->status);
    }

    char *str = cJSON_PrintUnformatted(root);
    strcpy(json, str);

    cJSON_free(str);

    return OK;
}
